最近,我拿到了 DeepMind 的研究工程师职位!对我来说,这无疑是梦想成真,我简直不敢相信!我没有机器学习的博士学位,没有机器学习的硕士学位,实际上我没有任何与机器学习有关的学位,我的本科专业是电子工程,我所接受的正规教育就这么多。在攻读电子工程硕士学位期间,我发现自己自学的效率更高,于是就选择了退学。我第一次接触机器学习是在 2018 年,而我第一次接触编程是 19 岁(现年 27 岁)。那么,我究竟是怎么做到的?(注意:我并不是特别聪明,你也可以!)我将在本文中分享所有的经历。为了尽可能地提供帮助,我会知无不言,言无不尽。这篇文章除了我个人的情况介绍,自学软件工程以及机器学习的过程,还有我顺利通过面试进入 DeepMind 的心得,希望能对各位有所启发。1. 个人的背景介绍,以及截止到目前的学习历程。我不想误导你们,让你们觉得即便没有扎实的基础和自学经验,没有机器学习的学位,仍然可以在短时间内实现这一目标。2. 我将详细介绍自 2018 年第一次接触机器学习以来,自学机器学习的整个过程。3. 最后,我将介绍如何准备 DeepMind 的面试。注意:虽然本文谈论的是 DeepMind,但这些经验同样适用于任何一流的 AI 实验室或公司,比如 OpenAI、FAIR、AI2 等。
第一部分:背景介绍(没有机器学习学位)
那是 2017 年的夏天,我在一家名叫 Telocate 的德国小型创业公司实习,担任Android 开发。当时我即将从电子工程专业毕业,这个专业主要学习的是数字/模拟电路,计算机科学方面的课程并不多。在我的本科学习即将结束之际(2016 年底),我发现我非常想转到软件行业。与硬件行业相比,软件更有意思,而且更加开放,还有各种黑客马拉松和数据马拉松,而且薪资待遇非常可观。于是,第二年(2017年)早些时候,我开始自学 Android,并获得了此次实习的机会。当时我非常兴奋,觉得整个世界都是我的。回到 2017 年的夏天。有一天,我和一位朋友聊天,我知道他是一位非常成功的软件工程师,曾在 MSFT、Facebook、Jane Street 等多家公司实习,而且当时他是我的同期,在聊天中我意识到自己落后了很多(至少在软件工程方面)。我的一些朋友从高中时代就开始参加各种编程比赛。如今,算法和数据结构已经成为了他们的第二天性。我想申请大型科技公司的职位,但我突然意识到,在科技巨头的公司面试中,我多年来积累的所有技能都微不足道。没人在意我会说 5 种语言,我知道很多关于微控制器工作原理的细节,如何从零开始搭建模拟高频电路,以及计算机的工作原理,但实际上人们在乎的只有算法和数据结构。我感到既困惑又愤怒。有个孩子年仅 16 岁(当时我 23 岁)就已经在Leetcode 上做了 9 个月的编程题,尽管他缺乏大量的基础工程知识,但事实就是,连他都遥遥领先于我。那种感觉非常糟心,我至今记忆犹新。我这个人一直很有上进心,而且勤奋刻苦,但如今却落后了。我很后悔为什么没有早一点看清这一切。可是,又能怎样呢?这个世界本来就是不公平的,但这种不公平干激励了我。我暗暗下决心,接下来几年我会加倍努力,飞速追赶。实习结束以后,回到学校我顺利毕业了。我记得我的一些朋友庆喝着啤酒,聊着天,前后庆祝了三个多星期。我呢?只在周末庆祝了一下顺利毕业,然后就立即开始制定计划。我感觉自己承担着某项使命。我象征性地注册了硕士课程(研究生可以获得一些津贴),但我心里明白我很想进入大型科技公司工作。因此,我动手制定了一份软件工程的学习计划,此外,还参加了大学的算法课程,尽管我并没有注册这些课程。我和比我小两岁的学弟学妹们坐在一起上课。在接下来的几个月里,我疯狂地学习,而且还申请了很多公司。不久之后, 2017 年 12 月我参加了 Facebook 的面试,但在第一轮就惨遭失败。我一直在坚持学习,还收到了微软的面试邀请,定在 2018 年 3 月。于是,我努力地学习。我参加了黑客马拉松和数据马拉松,并开始编程比赛(主要是在Topcoder上 )。2018 年 2 月,我听说微软组织了一个机器学习暑期培训班。于是,我申请了这个培训班,并参加了为期 3 天的入学考试,最后我居然被录取了!我有一种强烈的直觉,这是一次向微软展示自己的机会!大约在同一时期,我拿到了一家巴西公司的实习机会。这是一次奇妙的生活体验(我和 11 位巴西人共同生活了一段时间,而且还不得不学习说葡萄牙语),但算不上技术实习。这次实习紧跟在微软暑期培训班的后面。2018 年 3 月,我参加了微软的面试。但我未能通过笔试。幸运的是,两个月后他们又给了我一次机会。我又试了一次,而且还通过了笔试,并参加了 4 轮的现场面试,然而三周后,他们告诉我目前没有空缺职位。我心里明白,我被拒绝了,又一次……因此,如果说某人非常理解这个领域的新人,那么这个人就是我,我知道这整个求职过程有多么煎熬。2018 年夏天,我参加了微软的机器学习培训班,并全力以赴。我非常投入,学到了很多知识,我们的最终项目被评为内部最佳项目(用深度强化学习解魔方)。暑期培训班结束后,2018 年 8 月上旬,我立即踏上了飞往巴西的飞机。然而三天后,我接到了微软的电话。我拿到了 Offer,并要求我尽快到岗。那一刻,我悲喜交加。我不得不离开只住了一个多月的巴西。他们告诉我,接纳我的是“HoloLens 团队”,就是举办暑期培训班的团队。我肯定不能放过这个机会。于是,我接受了 Offer。2018年 9 月,我进入微软担任软件工程师。我居然真的成功了,我欣喜至极。从此,我的软件工程以及机器学习的职业生涯就开始了。然而,自从参加了暑期培训班后,DeepMind 和那种遥不可及的感觉深深地在我的潜意识中扎了根。我认识的 DeepMind 的人(他们曾在培训班讲课)都是牛津或剑桥毕业的高材生。但我的内心一直被那个没有可能性的挑战所吸引。我心想,曾经我以为微软遥不可及,但如今还是如愿以偿了。DeepMind 又何尝不可呢?所以,这个念头就深埋在我的潜意识里。从 2018 年至 2019 年,在微软工作期间,我付出了巨大努力,尽可能地学习软件工程。我阅读了很多编程书籍,比如 Scott Meyers 撰写的 C++ 编程等。工作之余,我利用空闲时间学习机器学习。在 2018 年底之前,我完成了 Coursera 上所有 Andrew Ng 的课程。此外,还参加了内部的机器学习黑客马拉松,并积极地参加了公司组织的机器学习培训班,同时还开始阅读研究论文。逐渐地,我开始对自己的机器学习知识越来越有信心。2019 年初,我分享了第一篇机器学习的博客。2019 年底,我在微软公司内部调整了岗位,并被派往 ICCV 2019 大会。回来以后,我拿到了一个任务,要求利用 PyTorch 从零开始实现一篇论文。那时我对 PyTorch 一无所知。不用说,通过这个任务我学习到了很多知识。我再一次得到飞速成长。但这一次,我更聪明了,在网上分享了整个学习过程。
第二部分:机器学习课程(2020 年 1 月 - 2021 年 6 月)
2020 年,新年来临了。我建立了自己的 YouTube 频道,分享我的机器学习之旅。同时,我展开了紧张的学习。我决定在接下来的一年里学习AI的各个子领域,我大致地计划了一下,打算在每个子领域投入三个月的时间。然而,刚开始的学习并不顺利,我只能再想办法。我学习的第一个子领域,神经风格迁移(Neural Style Transfer,即 NST),所花的时间超过了三个月,因为我觉得这个主题很有趣,又何必着急呢?一路上,我为自己找到了一个完美的策略。我按照以下方式组织学习。我有一个“宏观”学习周期(每三个月学习一个子领域),并在此基础之上穿插了多个微学习周期。1. 输入模式:大量摄入信息。目标是对某个子领域的结构有一个高层次的理解(通过博客和视频等),或者是对某个主题(通过研究论文和书籍等)有一个深入的了解。2. 输出模式:分享我学习到的知识。制作 YouTube 视频、建立 GitHub 项目或编写博客文章。后来,我也开始在推特和 Discord 上分享文章。然而,棘手的问题是如何一边利用空闲时间学习,一边做好微软的全职工作。这需要强大的毅力。每天早上醒来,首先我会写两个小时的代码,然后去散散步。回来以后,开始投入微软的工作。结束工作后,小睡 30 分钟。晚上睡觉前我还会再工作 2~3 个小时。我一直保持着这种疯狂的节奏。关于时间管理和抗压能力,总结起来就几句话:强大的毅力、正确的心态以及合理的休息(小憩非常奏效)。下面,我来详细谈一谈我学习的有关机器学习的详细知识,主要包括三个子领域:NST、DeepDream 和 GAN。1.NST(神经风格迁移)
在那段时间里,我学习了神经风格迁移。我阅读了一堆研究论文,实现了三个不同的项目,然后将代码公开到了 GitHub,还制做了一系列的 YouTube 视频。我进一步加强了 PyTorch 知识,学习了很多关于 CNN 以及优化的知识,提高了我的演讲技巧,能够更熟练地阅读研究论文,并从总体上提高了我的软件工程技术力。2. DeepDream
自从第一次看到用 DeepDream 制作的图片,我就深深地着迷。于是,我下定决心认真学习这门技术以及每一个细节。我无法满足于只使用在线生成器,我希望了解其背后的工作原理。我阅读了很多博客文章,阅读了 reddit 上关于 DeepDream 的子版块,并探索了各种代码库。大多数代码都是用 Torch & Lua 编写的。为了在 Windows 设置这个环境,我浪费了很多时间。后来换到了 Linux 上,终于可以正常工作了,但我意识到我永远不会使用这个代码库。我根据对 DeepDream 背后理论的理解,用代码生成了一些美丽的图像,下面是一个例子:3.GAN(生成式对抗网络)
2020年初,GAN 依然非常流行。而我缺乏这方面的基本知识,于是我决定接下来学习GAN。我阅读了很多开创性的论文(以及一些不太突出的论文),并实现了若干 GAN、cGAN(条件 GAN)和 DCGAN 模型。下面是我训练的 DCGAN 模型输出的图片:4. NLP & transformers
我想学习更多关于 BERT 和 GPT 系列模型的知识。Transformers无处不在,但我不太了解。我尝试从零开始实现 Transformer,并决定创建一个英德机器翻译系统。因为我会说这两种语言,所以我觉得这样调试起来更加容易,而事实也确实如此。5.图/几何机器学习
在开始尝试 Transformer 之前,我就想更深入地研究图机器学习。回想起来,我很高兴自己先学习了 Transformer/NLP,因为 NLP 对该领域产生了巨大的影响。GAT 的灵感直接来源于 Transformer 论文、Word2Vec 的 DeepWalk 等。我用 PyTorch 实现了一个流行的 GAT,后来这个实现非常受欢迎,有人说这是一个非常适合初学者的资源。6.RL(强化学习)
一直以来,我都很想学习强化学习,很巧 DeepMind 以其强化学习的突破性发展而闻名。我需要了解的论文和项目实在太多了, 比如 AlphaGo、DQN、OpenAI 的机械手等等。该领域与机器学习的其他子领域有很大的不同。数据点的独立性假设在此不成立,随机种子可能会导致代理无法收敛,等等。幸运的是,我在接触强化学习之前就积攒了很多经验,否则我很有可能失去动力。这一次,我仍然从我最感兴趣的方面入手:计算机视觉,通过它来丰富的机器学习知识。后来,又慢慢地转向了其他我知之甚少的话题。除了这条学习“主线”之外,早在 2020 年初阅读论文时,我就意识到自己在数学方面有些欠缺,所以我花了一些时间阅读了《面向机器学习的数学》。此外,我还阅读了以下书籍:●《PythonData Science Handbook》,第 5 章:帮助我学习了 SVM、PCA、线性回归等基本知识。● 《Automatethe Boring Stuff with Python》,跳过了前 11 章:自从快速学习了这门语言以来,我觉得至少应该读一本Python 的书。这本书让我建立了良好的心态,从总体上提高了我的生产力(概括:自动化重复的工作)。●《DeepLearning》:我只读了第一部分,因为我意识到我不需要理解所有的理论。你可以将这本书作为参考手册。●《The Bookof Why》:读这本书是因为我对因果关系非常感兴趣。此外, 在微软工作期间,我一直在从事各种软件工程与机器学习的项目:● 开发了一个眼镜检测算法,作为 HoloLens 2 设备上眼动追踪子系统的一部分。眼动追踪子系统的目的是预测用户眼球的视线向量,并实现用户与全息图的交互。它还可以为特定用户显示正确的图形(每个人的眼睛都不相同,因此瞳距也不同)。● 使用视频编码器,为各种 VR/MR 设备添加注视点渲染功能。这样就可以节省耗电量,因为不需要渲染周边视觉中的内容。我阅读了 H.264 编码器的整本参考手册。● 实现了一篇研究论文中的一个想法(在 PyTorch 中从零实现),用于跟踪用户身体上的特征点,并表明我们正在考虑的特定传感器是一个可行的选择。我也通过这个项目学习了PyTorch。● 编写各种脚本,用于验证标签是否正确。开发内部指标流水线的一部分,处理渲染和改进合成数据,各种量化,以及进行性能和计算量之间的平衡实验(因为我使用的是边缘设备),等等。● 面试了一些微软软件工程/机器学习职位的实习生。这让我熟悉了面试过程,并对面试官有了一定的了解。● 在机器学习培训班中辅导学生、讲课以及举办研讨会。
第三部分:DeepMind 向我敞开大门的经过
2021 年 4 月,我经一位朋友的介绍(我们在网上讨论机器学习认识的),找到了一家猎头。在看了我制作的 YouTube 视频以及 GitHub上的代码库后,他答应向 DeepMind 推荐我,并安排了一周后的面试。一句话总结,人际关系非常重要。没有人愿意推荐一个不认识的人,包括我自己在内。除非我们很熟悉这个人,或者通过某个渠道了解这个人的能力。最终面试准备
我申请的是研究工程师的职位。要想拿到 DeepMind 的 offer,你必须拥有扎实的背景。如果我没有在 GitHub 建立一系列机器学习相关的项目,没有之前的经验和一些成果物,肯定没有机会参加 DeepMind 的面试。注意:我没有任何原创的论文。事实证明,申请研究工程师这个职位不一定需要发表论文。但是研究科学家可能会有所不同,这个职位肯定需要参加顶级会议的经历和博士学位。我心里明白,即使你再优秀,也可能会遭到科技巨头的拒绝。对他们来说,宁可拒绝一个优秀的工程师,也不愿接受一个糟糕的工程师。因此,也不要有太多压力。其次,面试中经常遇到问题可能在日常工作中根本用不到,因此你必须花费精力认真做准备。● 认真研究你的每一位面试官。了解他们来自哪里以及他们是做什么的,这样你可以提出相关的问题。不要浪费他们的时间。你可以通过 LinkedIn、推特或其他渠道查看他们的个人资料。如果可能,请阅读他们的所有论文,或者阅读引用次数最多的论文。对于我的 DeepMind 面试官,我阅读了十多篇他的论文。虽然可能不是很必要,但我的确有这样的热情。● 透彻地研究简历中注明的每一个项目。无论是 GitHub 上的项目,还是在以前的公司做过的项目,你都必须能够与面试官深入讨论这些项目。● 模拟面试。找一些从事 AI 工作的朋友,充当你的面试官。为了准备DeepMind的面试,我认真地研究了一下 AGI,并阅读了一些 AI 论文:○ https://arxiv.org/abs/0706.3639○ https://arxiv.org/abs/0712.3329○ https://arxiv.org/abs/1911.01547以前我也研究过阿兰·图灵的一些论文“计算机与智能”以及 John Searle 等论文。此外,我还观看了很多人都视频。我做这项研究是因为这是 DeepMind 的使命:破解 AGI 并用它来解决高难度的科学问题。我觉得面试的时候肯定会有围绕这些主题的问题,所以我想全面了解一下。下面,我们来看看 DeepMind 招聘研究工程师的流程,主要包含以下几个步骤:1. 与招聘人员的首次沟通。让他们了解你主要对机器学习的应用感兴趣,还是对核心研发感兴趣。你应该谨慎对待这个面试。2. 小测验。这是为了测试你对数学、统计、计算机科学以及机器学习基本主题的掌握程度。3. 编程面试。与 Google、微软以及其他大型科技公司的软件工程师面试一样。4. 团队负责人面试。你们将讨论各种主题。简历上的任何内容都可能被问及,此外还包括机器学习问题以及个人行为问题。5. 团队高级负责人面试。结构上与上一次面试非常相似。此次面试是为了更明确地评估你是否适合这个团队。面试1:与招聘人员的首次沟通
做好功课,想清楚你究竟想在 DeepMind 做些什么(尽可能多!)。DeepMind 有 2 个“团队”(实际上相当于两个部门,两个“团队”都在朝着一个共同的使命努力):● “核心”研发团队。他们的工作更偏向于纯粹的研究。“类似生产”的项目包括AlphaFold(我猜应用团队也有参与)、AlphaGo 等。该团队中的研究人员从事的其他项目可能涉及与研究科学家合作,共同实现某些研究思路。● 应用团队。他们所做的一些项目包括数据中心节能项目、改进 Google 应用商店的推荐系统、WaveNet、Android 节能等等(他们的工作不仅限于Google)。你可以去 DeepMind 官网,阅读他们的博客,并研究公开招聘的职位。此外,我强烈建议你阅读一些面试的书籍。每个面试官都会评估你的个性以及你是否适合团队,所以做一些这方面的准备绝对不会有什么坏处。面试2:小测验
这可能是最难准备的部分,为了通过这个阶段的面试,你需要建立扎实的技术基础。● [计算机科学]我阅读了一些算法和数据结构的书。我跳过了一些我认为太“先进”的知识,比如 B 树(外部内存数据结构)以及特定的哈希函数等。此外,还复习了线性/非线性数据结构(图形/树)以及各种排序和搜索算法等主题。● [计算机科学]我阅读了一些操作系统的书,复习了死锁、线程、虚拟内存等知识。还阅读了一些 Python 的博客。● [计算机科学]我浏览了《算法导论》,复习了各种大O符号的理论。● [数学、经典机器学习]我又读了一遍机器学习与数学的书籍。● [机器学习]我复习了强化学习理论。在网上搜索了一些学习材料,什么是强化学习框架(env-agent-reward),什么是 MDP 等等。● [统计] 我观看了很多 YouTube 视频,复习了一遍所有不太了解的概念,还浏览了一些剑桥的材料。还没等复习完这些,我的面试就已经开始了,所以只是临时抱佛脚。我强烈建议你在开始面试之前就开始做准备。面试3:编程面试
我提前做了一些编程考题。我的心得是,当遇到不知道怎么解决的问题时,你可以看看第一个提示。如果没有帮助,再看下一个,依此类推。最后,即便你设法解决了问题,也要认真看一看给出的解决方案。你能够从中获取一些解决同类问题的新思路。此外,除了解决方案之外,你还必须分析解决方案消耗的内存以及时间复杂度。面试4~6:团队领导与公司文化面试
你只需要读一些面试的书籍,然后注意一下面试的一些细节。比如,他们会问你:“你喜欢 DeepMind 的哪些地方?”、“你为什么选择了 DeepMind,而不是其他公司?”、“谈一谈你最喜欢的项目。”实际上,我没有通过第5个面试(团队高级负责人的面试)。不过,实际上只是一个误会(我通过电子邮件收到反馈,他们非常友好),但生活还要继续。作为一名“技术过硬”的候选人,我被安排再参加一次孵化/应用部门的面试。我就按照上述给出的建议又做了一次准备,然后就一次性通关了。我拿到了offer!好消息是,在后一次面试中,我意识到孵化团队可能更适合我!
今后的计划
我将在今年晚些时候(2021 年 12 月)正式加入DeepMind,担任研究工程师。我对于下一阶段的职业发展兴奋不已!许多新鲜事物在等着我。我将搬到英国伦敦。我必须建立新的社交圈。我将接触到一种新文化、新语言(因为伦敦的文化非常多元)、一家新公司,甚至还有一个新的操作系统!● 在推特、LinkedIn 和 Discord 上分享我所做的一切。● 在 YouTube 上分享更多几何深度学习论文的解析。我希望通过本文与所有人分享我的此次经历,希望能为大家提供一些帮助。https://gordicaleksa.medium.com/how-i-got-a-job-at-deepmind-as-a-research-engineer-without-a-machine-learning-degree-1a45f2a781de
☞中国团队拿下EDA全球冠军;黄金版iPad mini 6售价54万;微软Bing推出网购全新功能 | 极客头条
☞微软“打入”Java内部,官宣加入JCP计划
☞年薪高达115万元,Rust成2021年最赚钱的编程语言